package com.bottle.android_mvi.domain.extensions

import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.launch

/**
 * 使用生命周期观察者来收集Flow排放的数据
 * 此函数允许在符合特定生命周期条件时，观察并处理Flow中的数据
 *
 * @param lifecycleOwner 生命周期所有者的引用，用于确定Flow开始收集的时机
 * @param minActiveState 可选参数，指定生命周期所有者必须处于或高于此状态时才开始收集，默认为Lifecycle.State.STARTED
 * @param collector FlowCollector接口的实现，用于处理Flow中收集到的每个数据项
 * @return 返回一个Job实例，表示异步操作的任务
 *
 * 说明：
 * 1. 该函数在生命周期所有者的生命周期作用域内启动一个协程
 * 2. 它会根据生命周期所有者的状态和指定的最小活动状态，控制Flow的收集过程
 * 3. 一旦生命周期所有者的状态达到或超过minActiveState，就会开始收集Flow，并将每个数据项传递给collector进行处理
 */
fun <T> Flow<T>.observeWithLifecycle(
    lifecycleOwner: LifecycleOwner,
    minActiveState: Lifecycle.State = Lifecycle.State.STARTED,
    collector: FlowCollector<T>,
): Job = lifecycleOwner.lifecycleScope.launch {
    flowWithLifecycle(lifecycleOwner.lifecycle, minActiveState).collect(collector)
}

fun <T> Flow<T>.observeWithLifecycle(
    fragment: androidx.fragment.app.Fragment,
    minActiveState: Lifecycle.State = Lifecycle.State.STARTED,
    collector: FlowCollector<T>,
): Job = observeWithLifecycle(fragment.viewLifecycleOwner, minActiveState, collector)

